<!DOCTYPE html>


<html lang="zh-CN">


<head>
  <meta charset="utf-8" />
   
  <meta name="keywords" content="zesicus" />
   
  <meta name="description" content="有所感，有所记" />
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>
    iOS app 反编译之路 |  黑森林
  </title>
  <meta name="generator" content="hexo-theme-ayer">
  
  <link rel="shortcut icon" href="/images/littleicon.png" />
  
  
<link rel="stylesheet" href="/dist/main.css">

  
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Shen-Yu/cdn/css/remixicon.min.css">

  
<link rel="stylesheet" href="/css/custom.css">

  
  
<script src="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>

  
  

  

<link rel="alternate" href="/atom.xml" title="黑森林" type="application/atom+xml">
</head>

</html>

<body>
  <div id="app">
    
      
    <main class="content on">
      <section class="outer">
  <article
  id="post-iOS-app-反编译之路"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h1 class="article-title sea-center" style="border-left:0" itemprop="name">
  iOS app 反编译之路
</h1>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/" class="article-date">
  <time datetime="2020-02-03T05:43:06.000Z" itemprop="datePublished">2020-02-03</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E6%8A%80%E6%9C%AF/">技术</a> / <a class="article-category-link" href="/categories/%E6%8A%80%E6%9C%AF/iOS/">iOS</a>
  </div>
  
<div class="word_count">
    <span class="post-time">
        <span class="post-meta-item-icon">
            <i class="ri-quill-pen-line"></i>
            <span class="post-meta-item-text"> 字数统计:</span>
            <span class="post-count">2.3k</span>
        </span>
    </span>

    <span class="post-time">
        &nbsp; | &nbsp;
        <span class="post-meta-item-icon">
            <i class="ri-book-open-line"></i>
            <span class="post-meta-item-text"> 阅读时长≈</span>
            <span class="post-count">8 分钟</span>
        </span>
    </span>
</div>
 
    </div>
      
    <div class="tocbot"></div>




  
    <div class="article-entry" itemprop="articleBody">
       
  <p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/cover.jpg" alt="Cover"></p>
<p>iOS app 反编译篇 –version 2020</p>
<a id="more"></a>

<h3 id="Step-1-准备"><a href="#Step-1-准备" class="headerlink" title="Step.1 准备"></a>Step.1 准备</h3><h4 id="Mac"><a href="#Mac" class="headerlink" title="Mac"></a>Mac</h4><p>这是我们做开发必备的工作环境，接下来我们需要准备几个工具。</p>
<h5 id="Clutch（不推荐下载）"><a href="#Clutch（不推荐下载）" class="headerlink" title="Clutch（不推荐下载）"></a><a target="_blank" rel="noopener" href="https://github.com/KJCracks/Clutch/releases">Clutch</a>（不推荐下载）</h5><blockquote>
<p>iOS 12.4 中无法执行，低版本应该可以使用，作者近期有更新，有望修复。</p>
</blockquote>
<p>砸壳工具，下载下来是一个 <strong>Clutch-2.0.4</strong> 文件，改名为 <strong>Clutch-2.0.4</strong> 备用。</p>
<h5 id="dumpdecypted-不推荐下载"><a href="#dumpdecypted-不推荐下载" class="headerlink" title="dumpdecypted (不推荐下载)"></a><a target="_blank" rel="noopener" href="https://github.com/stefanesser/dumpdecrypted">dumpdecypted</a> (不推荐下载)</h5><blockquote>
<p>iOS 12.4 注入失败，作者久久未更新，除了低版本的iOS其他应该不好搞了。</p>
</blockquote>
<p>砸壳工具，下载下来解压，里面应该只有 3 个文件：<strong>Makefile</strong>、<strong>README</strong>、<strong>dumpdecrypted.c</strong>，我们需要编译一下它，终端 <code>cd</code> 到这个文件夹执行：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> make</span></span><br></pre></td></tr></table></figure>
<p>得到我们需要的文件 <strong>dumpdecrypted.dylib</strong>，留作备用。</p>
<h5 id="class-dump"><a href="#class-dump" class="headerlink" title="class dump"></a><a target="_blank" rel="noopener" href="http://stevenygard.com/projects/class-dump/">class dump</a></h5><p>反编译工具，<strong>用它可以导出 OC 程序的全部 *.h 文件，但是不能够导出 *.m 文件。</strong></p>
<p>建议放到一个位置然后给它一个全局从而直接运行它。</p>
<blockquote>
<p>比如我将 dmg 镜像中的三个项放到了 <strong>~/Application/classdump</strong> 文件夹中，修改 <code>.zshrc</code> 文件添加 <code>export PATH=/Users/zesicus/Applications/classdump:$PATH</code> 这一条，保存后执行刷新 <code>source .zshrc</code> 就可以直接使用 <code>class-dump</code> 命令了。</p>
</blockquote>
<h5 id="Hopper-Disassembler"><a href="#Hopper-Disassembler" class="headerlink" title="Hopper Disassembler "></a><a target="_blank" rel="noopener" href="http://www.sdifen.com/hopperdisassembler408.html">Hopper Disassembler </a></h5><p>反编译工具，用它可以反编译出程序包的汇编代码，可以转义成 <strong>伪代码</strong>，收费 99 刀，建议用破解版。</p>
<h5 id="iFunbox"><a href="#iFunbox" class="headerlink" title="iFunbox"></a><a target="_blank" rel="noopener" href="http://www.i-funbox.com/en/index.html">iFunbox</a></h5><p>辅助工具，老牌图形 iOS 文件管理器，下了它然后像安装 Mac 程序一样安装它。</p>
<h4 id="iPhone"><a href="#iPhone" class="headerlink" title="iPhone"></a>iPhone</h4><p>Sorry，它必须是越狱的 iPhone。</p>
<h5 id="越狱"><a href="#越狱" class="headerlink" title="越狱"></a>越狱</h5><p>希望你不要被这一步卡住，截止到目前很幸运我的 iPhone 6 运行的是 <strong>iOS 12.4</strong> 的系统还在能够越狱的行列中，如果你像我一样，或者在 <strong>iOS 11.0 - 12.4</strong> 这个版本区间中，可以使用 <a target="_blank" rel="noopener" href="https://unc0ver.dev/">unc0ver</a> 工具进行越狱。</p>
<blockquote>
<p>下载下来的 <strong>unc0ver</strong> 工具是个 ipa 包，但是不能直接安装，我们需要使用 <strong><a target="_blank" rel="noopener" href="https://github.com/maciekish/iReSign">iReSign</a></strong> 进行重签名操作 (具体重签名步骤请查看我的另一篇博客 <a href="https://zesicus.gitee.io/2020/02/03/iOS-app-%E9%87%8D%E7%AD%BE%E5%90%8D-iReSign/">iOS app 重签名 iReSign</a>)。当我们把 <strong>unc0ver</strong> 推送进手机之后，直接打开它点击 “jail break” 就行了！</p>
</blockquote>
<p>另外，其他iOS版本都可以用 <strong><a target="_blank" rel="noopener" href="https://www.i4.cn/">爱思助手</a></strong> 的 <strong>一键越狱</strong> 功能看看是否有其他解决方案。</p>
<p>越狱后必装的插件：</p>
<ul>
<li>OpenSSH</li>
<li>Cycript</li>
<li>CrackerXI（推荐的砸壳工具，如果你使用了签名两个，这个就不必安装了，推荐的安装源 蚂蚁源(<a target="_blank" rel="noopener" href="http://apt.cydia.love),我的版本/">http://apt.cydia.love)，我的版本</a> 1.1.16）</li>
</ul>
<blockquote>
<p>越狱后其他必装插件可能还有 <strong>afc2</strong> 和 <strong>AppSync</strong>，iOS 12 下的这两个插件大多已经不支持了，这里推荐雷锋源(<a target="_blank" rel="noopener" href="http://apt.abcydia.com/">http://apt.abcydia.com</a>) 搜索 <strong>AFC2 iOS11~13 系统路径</strong> 和 <strong>AppSync Unified 关闭签名</strong> 这两个安装。</p>
</blockquote>
<h3 id="Step-2-砸壳"><a href="#Step-2-砸壳" class="headerlink" title="Step.2 砸壳"></a>Step.2 砸壳</h3><h4 id="下载App应用"><a href="#下载App应用" class="headerlink" title="下载App应用"></a>下载App应用</h4><p>我们从 AppStore 下载 app 安装，因为生活比较潦倒就拿常用的 “瑞银信” 来开个刀。</p>
<h4 id="iPhone-SSH"><a href="#iPhone-SSH" class="headerlink" title="iPhone SSH"></a>iPhone SSH</h4><p>确保 iPhone 和 Mac 在同一个局域网中，然后 <strong>iPhone -&gt; 无线局域网 -&gt; 点击你的无线网最右边叹号 -&gt; 查看 IP 地址</strong>，我的 ip 是 192.168.0.101。</p>
<p>Mac 打开 Terminal，执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> ssh root@192.168.0.101</span></span><br></pre></td></tr></table></figure>
<p>输入默认密码 <code>alpine</code> 回车，等待终端出现 <code>xxx:~ root#</code> 即为连接成功。</p>
<blockquote>
<p>如果你没有使它们处于同一个网络，但是有数据线，也可以使用 <strong>爱思助手 -&gt;  工具 -&gt; 打开 SSH 通道</strong> 来连接本地 SSH。</p>
</blockquote>
<p><strong>请注意：这里我们把已连接 iPhone SSH 的 terminal 称为 “iPhoneSSHTerminal”，并且下文都将如此称呼。</strong></p>
<h4 id="查找程序目录"><a href="#查找程序目录" class="headerlink" title="查找程序目录"></a>查找程序目录</h4><p>我们清除 iPhone 全部进程，打开我们准备开刀的 app 并保持前台不动。</p>
<p>然后在 iPhoneSSHTerminal 中执行 <code>ps -e</code> 查看我们iPhone正在运行的程序。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_1.png" alt="图 1"></p>
<p>如图一所示，只要以 <code>/var...</code> 开头的一般都是我们当前运行的程序了。</p>
<h4 id="导出-app包"><a href="#导出-app包" class="headerlink" title="导出.app包"></a>导出.app包</h4><p>我们使用数据线连接 Mac 和 iPhone，然后打开 <strong>iFunbox</strong>，应该能看到 iPhone 的整个系统目录了。</p>
<p>根据我们上一步找到的目录进入到该文件夹，导出 <em>RuiYinXin.app</em>。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_2.png" alt="图 2"></p>
<h4 id="查看是否加壳"><a href="#查看是否加壳" class="headerlink" title="查看是否加壳"></a>查看是否加壳</h4><p>找到我们刚才导出的 <em>RuiYinXin.app</em>，右键 <strong>显示包内容</strong>，找到 <strong>RuiYinXin</strong> 如下图所示。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_3.png" alt="图 3"></p>
<p>使用终端 <code>cd</code> 到 <em>RuiYinXin.app</em> 目录下执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> otool -l RuiYinXin | grep crypt</span></span><br></pre></td></tr></table></figure>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_4.png" alt="图 4"></p>
<h4 id="砸壳"><a href="#砸壳" class="headerlink" title="砸壳"></a>砸壳</h4><h5 id="CrackerXI（神器）"><a href="#CrackerXI（神器）" class="headerlink" title="CrackerXI（神器）"></a>CrackerXI（神器）</h5><p>这个越狱插件可以简单实用的帮助我们砸壳。</p>
<p>打开桌面上的 CrackerXI+，可以看到安装的 app 列表，点击 Tab 上的 <strong>Settings</strong> 按钮。</p>
<p>开启 <strong>CrackerHook</strong> 功能。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_15.jpeg" alt="图 15"></p>
<p>返回 <strong>Applist</strong>，点击想要破解的 app，根据需要选择 <strong>“YES, Full IPA”</strong> 或者 <strong>“YES, Binary Only”</strong> 去壳，破解完成后会弹框告诉你去壳存放在哪。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_16.png" alt="图 16"></p>
<p>使用 <strong>iFunbox</strong> 导出去壳包备用。</p>
<h5 id="Clutch（不推荐）"><a href="#Clutch（不推荐）" class="headerlink" title="Clutch（不推荐）"></a>Clutch（不推荐）</h5><blockquote>
<p>此方法在 iOS 12.4 中执行失败</p>
</blockquote>
<p>将 “<strong>Clutch</strong>“ 工具通过 <strong>iFunbox</strong> 上传至 iPhone <code>/var/root</code> 目录，并在 <em>iPhoneSSHTerminal</em> 执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> chmod +x Clutch</span></span><br></pre></td></tr></table></figure>
<p>通过 <code>ls -la</code> 查看文件属性确保加权成功</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_13.png" alt="图 13"></p>
<p><em>iPhoneSSHTerminal</em> 使用 <code>Clutch -i</code> 查看安装的 app</p>
<p>在这一步骤我遇到了 <code>killed: 9</code> 错误。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_14.png" alt="图 14"></p>
<p>如果没有出错，应该就能看到序号标识的已安装 app 了，然后执行</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># Clutch -d 10  (假如 10 是我想要砸壳的app序号)</span><br></pre></td></tr></table></figure>
<p>完成后根据 Log 找到砸壳成功的 ipa 文件备用。</p>
<h5 id="dumpdecrypted（不推荐）"><a href="#dumpdecrypted（不推荐）" class="headerlink" title="dumpdecrypted（不推荐）"></a>dumpdecrypted（不推荐）</h5><blockquote>
<p>此方法 iOS 12.4 使用 <code>DYLD_INSERT_LIBRARIES </code> 注入失败。</p>
</blockquote>
<p>在终端中执行以下命令查看我们已安装的证书。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> security find-identity -v -p codesigning</span></span><br></pre></td></tr></table></figure>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_5.png" alt="图 5"></p>
<p>Oops! 可以看到里面有一大堆的证书，还有一些标注为 <em>“REVOKED”</em> 的已失效证书，先不管那么多，我们接下来要对之前编译好的 <strong>dumpdecrypted.dylib</strong> 文件做一次签名。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> codesign --force --verify --verbose --sign <span class="string">&quot;iPhone Developer: zesicus@icloud.com (P3BSK34F2E)&quot;</span> dumpdecrypted.dylib</span></span><br></pre></td></tr></table></figure>
<p>执行后返回</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_6.png" alt="图 6"></p>
<p>由于我自己的帐号不是开发者帐号，开发时系统自动签署了很多证书，现在导致系统已经不能够分清我使用的是哪个证书，看来必须要清理一下那些乱七八糟的证书了。</p>
<p>打开 <strong>钥匙串</strong>，我准备对这些铺面而来的证书做一次清理。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_7.png" alt="图 7"></p>
<p>清除这些重复过期证书后，签名成功。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_8.png" alt="图 8"></p>
<p>到 iPhoneSSHTerminal 我们执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> cycript -p 进程号</span></span><br></pre></td></tr></table></figure>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_9.png" alt="图 9"></p>
<p>在这里可以写 OC 代码了，我们来获取它的 <strong>Documents</strong> 目录。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]</span><br></pre></td></tr></table></figure>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_10.png" alt="图 10"></p>
<p>根据上图的路径我们通过 <strong>iFunbox</strong> 找到该路径，把签名过的 <strong>dumpdecrypted.dylib</strong> 放进去。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_11.png" alt="图 11"></p>
<p>接下来使用 <code>Ctrl + D</code> 退出 <code>cy#</code> 钩子，* iPhoneSSHTerminal* <code>cd</code> 到 <em>Document</em> 目录下，执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">root#</span><span class="bash"> DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/C5319BE8-065A-471C-8D42-5F2E090A720D/RuiYinXin.app/RuiYinXin</span></span><br></pre></td></tr></table></figure>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_12.png" alt="图 12"></p>
<p>这里我遇到了注入失败问题，尝试了一些方法未能解决，猜想可能是iOS版本问题，如果你在 iOS 12.4 上面解决了，希望能够告诉我你的解决方案！🙏 <a href="mailto:&#x7a;&#x65;&#115;&#105;&#x63;&#117;&#x73;&#x40;&#49;&#x36;&#51;&#46;&#x63;&#111;&#109;">&#x7a;&#x65;&#115;&#105;&#x63;&#117;&#x73;&#x40;&#49;&#x36;&#51;&#46;&#x63;&#111;&#109;</a></p>
<p>如果砸壳成功了，应该会生成一个 <strong>xxx.decrypted</strong> 文件，为脱壳文件，将它拷贝到 Mac 端。</p>
<h3 id="Step-3-反编译"><a href="#Step-3-反编译" class="headerlink" title="Step.3 反编译"></a>Step.3 反编译</h3><p>经过复杂的去壳过程之后，剩下的就是反编译拿出我们需要的文件了。</p>
<h4 id="class-dump-1"><a href="#class-dump-1" class="headerlink" title="class dump"></a>class dump</h4><p>通过 class dump 可以拿到 OC 编写程序的头文件。</p>
<p>首先我们在桌面上新建一个文件夹用于放置破解出来的<em>\</em>.h* 文件，比如 <strong>hackfiles</strong>，然后把我们反编译拿出来的 xxx.ipa 包用解压工具（我使用的是 <em>The Unarchiver</em>）解压，解压后同目录出现一个 <strong>Payload</strong> 文件夹，点击进去里面就是 <strong>RuiYinXin.app</strong>，我们使用终端进入 <strong>RuiYinXin.app</strong> 的目录路径执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> class-dump -H RuiYinXin -o ~/Desktop/hackfiles/</span></span><br></pre></td></tr></table></figure>
<p>执行过程有些慢且没有Log输出，稍微等一会儿出现输入提示说明破解好了。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_17.png" alt="图 17"></p>
<p>但是假如这个程序是 Swift 写出来的呢，有点好奇会破解出什么来，我们来试一下，用我自己写的程序：</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_18.png" alt="图 18"></p>
<p>出错了！看来 class dump 对 swift 写的程序是没辙了。</p>
<h4 id="Hoper-Disassembler"><a href="#Hoper-Disassembler" class="headerlink" title="Hoper Disassembler"></a>Hoper Disassembler</h4><p>这个可以把二进制包用伪代码的形式解析出来，也可以直接修改。</p>
<p>我们把解密的 <em>RuiYinXin.app</em> 显示包内容，把里面的 <strong>RuiYinXin</strong> 文件直接拖到 <em>Hoper Disassembler</em> 的窗口上，即可开始反编译。</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_19.png" alt="图 19"></p>
<p>如果是 Swift 写的程序也可以通过伪代码类OC的形式展示出来</p>
<p><img src="/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/pic_20.png" alt="图 20"></p>
<h3 id="End-总结"><a href="#End-总结" class="headerlink" title="End. 总结"></a>End. 总结</h3><p>其实我们拿到 <em>RuiYinXin.ipa</em> 解压出来的 <em>RuiYinXin.app</em> 包里面就有很多有意思的东西，包括了 <strong>pri.key</strong> 和 <strong>pub.key</strong> 这两个文件，所以说最基础的防护我们还是要做一下的，被这么简单的拿到真的是有些不走心了。</p>
<p>如果想要更深入的去查探我们想要的内容，最重要的是搜索功能，使用搜索来不断的去推代码的脉络，这和我们去读别人的代码是一样的，只是难度大了很多。</p>
<p>总的来说这只是个开始，因为除了越狱，砸壳，最核心的反编译工具反推出来的代码并没有深刻去理解，所以想要玩好，汇编还是要懂的。祝我们往后的道路上更进一步吧！共勉。</p>
 
      <!-- reward -->
      
      <div id="reword-out">
        <div id="reward-btn">
          打赏
        </div>
      </div>
      
    </div>
    

    <!-- copyright -->
    
    <div class="declare">
      <ul class="post-copyright">
        <li>
          <i class="ri-copyright-line"></i>
          <strong>版权声明： </strong>
          
          本博客所有文章除特别声明外，著作权归作者所有。转载请注明出处！
          
        </li>
      </ul>
    </div>
    
    <footer class="article-footer">
       
<div class="share-btn">
      <span class="share-sns share-outer">
        <i class="ri-share-forward-line"></i>
        分享
      </span>
      <div class="share-wrap">
        <i class="arrow"></i>
        <div class="share-icons">
          
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="ri-weibo-fill"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="ri-wechat-fill"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="ri-qq-fill"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="ri-douban-line"></i>
          </a>
          <!-- <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a> -->
          
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="ri-facebook-circle-fill"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="ri-twitter-fill"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="ri-google-fill"></i>
          </a>
        </div>
      </div>
</div>

<div class="wx-share-modal">
    <a class="modal-close" href="javascript:;"><i class="ri-close-circle-line"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="//api.qrserver.com/v1/create-qr-code/?size=150x150&data=https://zesicus.gitee.io/2020/02/03/iOS-app-%E5%8F%8D%E7%BC%96%E8%AF%91%E4%B9%8B%E8%B7%AF/" alt="微信分享二维码">
    </div>
</div>

<div id="share-mask"></div>  
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/iOS/" rel="tag">iOS</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E5%8F%8D%E7%BC%96%E8%AF%91/" rel="tag">反编译</a></li></ul>

    </footer>
  </div>

   
  <nav class="article-nav">
    
      <a href="/2020/02/03/iOS-app-%E9%87%8D%E7%AD%BE%E5%90%8D-iReSign/" class="article-nav-link">
        <strong class="article-nav-caption">上一篇</strong>
        <div class="article-nav-title">
          
            iOS app 重签名 iReSign
          
        </div>
      </a>
    
    
      <a href="/2020/01/31/VS-Code-%E6%8F%92%E4%BB%B6-prefer/" class="article-nav-link">
        <strong class="article-nav-caption">下一篇</strong>
        <div class="article-nav-title">VS Code 插件 prefer</div>
      </a>
    
  </nav>

   
<!-- valine评论 -->
<div id="vcomments-box">
  <div id="vcomments"></div>
</div>
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/valine@1.4.14/dist/Valine.min.js"></script>
<script>
  new Valine({
    el: "#vcomments",
    app_id: "M5MxuHVy9KSi3HL3TynyJ7Wx-gzGzoHsz",
    app_key: "R1KGWG7s6ISWPXYKvbmjyNka",
    path: window.location.pathname,
    avatar: "monsterid",
    placeholder: "给我的文章加点评论吧~",
    recordIP: true,
  });
  const infoEle = document.querySelector("#vcomments .info");
  if (infoEle && infoEle.childNodes && infoEle.childNodes.length > 0) {
    infoEle.childNodes.forEach(function (item) {
      item.parentNode.removeChild(item);
    });
  }
</script>
<style>
  #vcomments-box {
    padding: 5px 30px;
  }

  @media screen and (max-width: 800px) {
    #vcomments-box {
      padding: 5px 0px;
    }
  }

  #vcomments-box #vcomments {
    background-color: #fff;
  }

  .v .vlist .vcard .vh {
    padding-right: 20px;
  }

  .v .vlist .vcard {
    padding-left: 10px;
  }
</style>

 
   
     
</article>

</section>
      <footer class="footer">
  <div class="outer">
    <ul>
      <li>
        Copyrights &copy;
        2020-2021
        <i class="ri-heart-fill heart_icon"></i> Decline
      </li>
    </ul>
    <ul>
      <li>
        
        
        
        由 <a href="https://hexo.io" target="_blank">Hexo</a> 强力驱动
        <span class="division">|</span>
        主题 - <a href="https://github.com/Shen-Yu/hexo-theme-ayer" target="_blank">Ayer</a>
        
      </li>
    </ul>
    <ul>
      <li>
        
        
        <span>
  <span><i class="ri-user-3-fill"></i>访问人数:<span id="busuanzi_value_site_uv"></span></s>
  <span class="division">|</span>
  <span><i class="ri-eye-fill"></i>浏览次数:<span id="busuanzi_value_page_pv"></span></span>
</span>
        
      </li>
    </ul>
    <ul>
      
    </ul>
    <ul>
      
    </ul>
    <ul>
      <li>
        <!-- cnzz统计 -->
        
        <script type="text/javascript" src='https://v1.cnzz.com/z_stat.php?id=1279621682&amp;web_id=1279621682'></script>
        
      </li>
    </ul>
  </div>
</footer>
      <div class="float_btns">
        <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>

<div class="todark" id="todark">
  <i class="ri-moon-line"></i>
</div>

      </div>
    </main>
    <aside class="sidebar on">
      <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/"><img src="/images/logoicon.png" alt="黑森林"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/archives">归档</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/categories">分类</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/friends">友链</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/about">关于我</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      <a class="nav-item-link nav-item-search"  title="搜索">
        <i class="ri-search-line"></i>
      </a>
      
      
      <a class="nav-item-link" target="_blank" href="/atom.xml" title="RSS Feed">
        <i class="ri-rss-line"></i>
      </a>
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
    </aside>
    <script>
      if (window.matchMedia("(max-width: 768px)").matches) {
        document.querySelector('.content').classList.remove('on');
        document.querySelector('.sidebar').classList.remove('on');
      }
    </script>
    <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>请我喝杯咖啡吧~</p>
  <div class="reward-box">
    
    <div class="reward-item">
      <img class="reward-img" src="/images/ali.jpeg">
      <span class="reward-type">支付宝</span>
    </div>
    
    
    <div class="reward-item">
      <img class="reward-img" src="/images/wx.png">
      <span class="reward-type">微信</span>
    </div>
    
  </div>
</div>
    
<script src="/js/jquery-2.0.3.min.js"></script>


<script src="/js/lazyload.min.js"></script>

<!-- Tocbot -->


<script src="/js/tocbot.min.js"></script>

<script>
  tocbot.init({
    tocSelector: '.tocbot',
    contentSelector: '.article-entry',
    headingSelector: 'h1, h2, h3, h4, h5, h6',
    hasInnerContainers: true,
    scrollSmooth: true,
    scrollContainer: 'main',
    positionFixedSelector: '.tocbot',
    positionFixedClass: 'is-position-fixed',
    fixedSidebarOffset: 'auto'
  });
</script>

<script src="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.css">
<script src="https://cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/js/jquery.justifiedGallery.min.js"></script>

<script src="/dist/main.js"></script>

<!-- ImageViewer -->

<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.min.css">
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script>

<!-- MathJax -->

<!-- Katex -->

<!-- busuanzi  -->


<script src="/js/busuanzi-2.3.pure.min.js"></script>


<!-- ClickLove -->

<!-- ClickBoom1 -->

<!-- ClickBoom2 -->

<!-- CodeCopy -->


<link rel="stylesheet" href="/css/clipboard.css">

<script src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js"></script>
<script>
  function wait(callback, seconds) {
    var timelag = null;
    timelag = window.setTimeout(callback, seconds);
  }
  !function (e, t, a) {
    var initCopyCode = function(){
      var copyHtml = '';
      copyHtml += '<button class="btn-copy" data-clipboard-snippet="">';
      copyHtml += '<i class="ri-file-copy-2-line"></i><span>COPY</span>';
      copyHtml += '</button>';
      $(".highlight .code pre").before(copyHtml);
      $(".article pre code").before(copyHtml);
      var clipboard = new ClipboardJS('.btn-copy', {
        target: function(trigger) {
          return trigger.nextElementSibling;
        }
      });
      clipboard.on('success', function(e) {
        let $btn = $(e.trigger);
        $btn.addClass('copied');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-checkbox-circle-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPIED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-checkbox-circle-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
      clipboard.on('error', function(e) {
        e.clearSelection();
        let $btn = $(e.trigger);
        $btn.addClass('copy-failed');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-time-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPY FAILED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-time-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
    }
    initCopyCode();
  }(window, document);
</script>


<!-- CanvasBackground -->


<script src="/js/dz.js"></script>



    
  </div>
</body>

</html>